Przykad 6.4. Realizacja algorytmu Dijkstry dla grafw gstych
#include "Graph.h"
void singleSourceShortest (Graph const &graph, int s,               /* we */
                           vector<int> &dist, vector<int> &pred) {  /* wy */

   // Zainicjuj tablice dist[] i pred[]. Zacznij od wierzchoka s,
   // ustawiajc dist[] na 0.
   const int n = graph.numVertices();
   pred.assign(n, -1);
   dist.assign(n, numeric_limits<int>::max());
   vector<bool> visited(n);
   dist[s] = 0;

   // W nieustannie zmniejszajcym si zbiorze V-S znajd wierzchoek,
   // ktrego warto dist jest najmniejsza. Wylicz nowe potencjalne
   // cieki, aby uaktualni wszystkie najkrtsze cieki.
   while (true) {
      // Znajd aktualnie najkrtsz odlego w nie odwiedzonych wierzchokach
      int u = -1;
      int sd = numeric_limits<int>::max();   // zakadamy, e nieosigalne
      for (int i = 0; i < n; i++) {
         if (!visited[i] && dist[i] < sd) {
            sd = dist[i];
            u = i;
         }
      }
      if (u == -1) { break; }   // nie mona postpi dalej

      // Dla ssiadw u sprawd, czy dugo najlepszej cieki z s->u +
      // waga krawdzi u->v jest lepsza ni najlepsza cieka z s->v.
      visited[u] = true;
      for (VertexList::const_iterator ci = graph.begin(u);
           ci != graph.end(u); ++ci) {
         int v = ci->first;                // ssiad v
         long newLen = dist[u];            // obliczaj w typie long
         newLen += ci->second;             // sumuj z wag (u,v)
         if (newLen < dist[v]) {
            dist[v] = newLen;
            pred[v] = u;
         }
      }
   }
}
